//package com.qys.livesMall.common.utils.bean;
//
//import com.qys.livesMall.common.exception.QysException;
//import com.qys.livesMall.common.exception.enums.ExceptionEnum;
//import lombok.extern.slf4j.Slf4j;
//import net.sf.cglib.beans.BeanGenerator;
//import net.sf.cglib.beans.BeanMap;
//import org.apache.commons.beanutils.PropertyUtilsBean;
//import org.springframework.stereotype.Component;
//
//import java.beans.PropertyDescriptor;
//import java.lang.reflect.Field;
//import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Objects;
//
///**
// * 动态为bean添加字段
// * @Author gongl
// * @Create 2022-01-11
// */
//@Slf4j
//@Component
//public class DynamicBeanUtils<T,R> {
//
//    public  T build(T inBean, R outBean){
//        return getTarget(inBean,new ObjectToMapUtil<R>().to(outBean));
//    }
//
//
//    public T  getTarget(T dest, Map<String, Object> addProperties) {
//        PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
//        //得到原对象的属性
//        PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest);
//        Map<String, Class<?>> propertyMap = new HashMap<>();
//        for (PropertyDescriptor d : descriptors) {
//            if (!"class".equalsIgnoreCase(d.getName())) {
//                propertyMap.put(d.getName(), d.getPropertyType());
//            }
//        }
//        addProperties.forEach((k, v) -> propertyMap.put(k, v==null?null:v.getClass()));
//        //构建新的对象
//        DynamicBean dynamicBean = new DynamicBean((Class<T>) dest.getClass(), propertyMap);
//        for (Map.Entry<String, Class<?>> entry : propertyMap.entrySet()) {
//            try {
//                if (!addProperties.containsKey(entry.getKey())) {//原来的值
//                    dynamicBean.setValue(entry.getKey(), propertyUtilsBean.getNestedProperty(dest, entry.getKey()));
//                }else {//新增的值
//                    dynamicBean.setValue(entry.getKey(), addProperties.get(entry.getKey()));
//                }
//            } catch (Exception e) {
//                log.error(e.getMessage(), e);
//            }
//        }
//        return dynamicBean.getTarget();
//    }
//
//    private class DynamicBean {
//        /**
//         * 目标对象
//         */
//        private T target;
//
//        /**
//         * 属性集合
//         */
//        private BeanMap beanMap;
//
//        public DynamicBean(Class<T> superclass, Map<String, Class<?>> propertyMap) {
//            this.target = generateBean(superclass, propertyMap);
//            this.beanMap = BeanMap.create(this.target);
//        }
//
//
//        /**
//         * bean 添加属性和值
//         *
//         * @param property
//         * @param value
//         */
//        public void setValue(String property, Object value) {
//            beanMap.put(property, value);
//        }
//
//        /**
//         * 获取属性值
//         *
//         * @param property
//         * @return
//         */
//        public Object getValue(String property) {
//            return beanMap.get(property);
//        }
//
//        /**
//         * 获取对象
//         *
//         * @return
//         */
//        public T getTarget() {
//            return this.target;
//        }
//
//
//        /**
//         * 根据属性生成对象
//         *
//         * @param superclass
//         * @param propertyMap
//         * @return
//         */
//        private T generateBean(Class<T> superclass, Map<String, Class<?>> propertyMap) {
//            BeanGenerator generator = new BeanGenerator();
//            if (null != superclass) {
//                generator.setSuperclass(superclass);
//            }
//            BeanGenerator.addProperties(generator, propertyMap);
//            return (T)generator.create();
//        }
//
//    }
////    public static void main(String[] args) {
////        new ObjectToMapUtil<String>().to(null);
////    }
//
//
//}
//class ObjectToMapUtil<T> {
//    /**
//     * 使用反射
//     */
//    public Map<String, Object> to(Object object) {
//        Map<String, Object> dataMap = new HashMap<>();
//        if (object == null) {
//            try {
//                object = new ClassBean<T>().t;
//            } catch (Exception e) {
//                throw new QysException(ExceptionEnum.UNKNOWN);
//            }
//        }
//        Class<?> clazz = object.getClass();
//        for (Field field : clazz.getDeclaredFields()) {
//            try {
//                field.setAccessible(true);
//                dataMap.put(field.getName(), field.get(object));
//            } catch (IllegalAccessException e) {
//                e.printStackTrace();
//            }
//        }
//        return dataMap;
//    }
//}
//
//
//
//class ClassBean<T>{
//    public Class<T> clazz;
//    public T t;
//
//    public ClassBean() throws IllegalAccessException, InstantiationException {
//        Type superclass = getClass().getGenericSuperclass();
//        ParameterizedType parameterizedType = null;
//        if (superclass instanceof ParameterizedType) {
//            parameterizedType = (ParameterizedType) superclass;
//            Type[] typeArray = parameterizedType.getActualTypeArguments();
//            if (typeArray != null && typeArray.length > 0) {
//                clazz = (Class<T>) typeArray[0];
//                t= clazz.newInstance();
//            }
//        }
//    }
//}
//
//
//
//
////
////class Dao<T> {
////    public Class<T> clazz;
////    public T user;
////    public Dao() throws IllegalAccessException, InstantiationException {
////        Type superclass = getClass().getGenericSuperclass();
////        ParameterizedType parameterizedType = null;
////        if (superclass instanceof ParameterizedType) {
////            parameterizedType = (ParameterizedType) superclass;
////            Type[] typeArray = parameterizedType.getActualTypeArguments();
////            if (typeArray != null && typeArray.length > 0) {
////                clazz = (Class<T>) typeArray[0];
////                user= clazz.newInstance();
////            }
////        }
////    }
////
////    @Override
////    public String toString() {
////        return "Dao{" +
////                "user=" + user.toString() +
////                '}';
////    }
////}
////
////class UserDao extends Dao<User> {
////
////    public UserDao() throws IllegalAccessException, InstantiationException {
////    }
////
////    @Override
////    public String toString() {
////        return super.toString();
////    }
////}
////
////class User {
////    String name;
////
////    public User() {
////        this.name = "default name";
////    }
////
////    @Override
////    public String toString() {
////        return "User{" +
////                "name='" + name + '\'' +
////                '}';
////    }
////}
